package com.fatmeraid.common.result;

import lombok.Data;

/**
 * 全局统一返回结果类
 * 用于封装统一的API返回结果，包含返回码、返回消息和返回数据
 * @param <T> 返回数据的类型
 */
@Data
public class Result<T> {

	//返回码
	private Integer code;

	//返回消息
	private String message;

	//返回数据
	private T data;

	public Result() {
	}

	/**
	 * 构建返回结果对象
	 * @param data 返回的数据
	 * @param <T> 返回数据的类型
	 * @return 构建的Result对象
	 */
	private static <T> Result<T> build(T data) {
		Result<T> result = new Result<>();
		if (data != null)
			result.setData(data);
		return result;
	}

	/**
	 * 构建返回结果对象，设置数据和结果码枚举信息
	 * @param body 返回的数据
	 * @param resultCodeEnum 结果码枚举，包含返回码和返回消息
	 * @param <T> 返回数据的类型
	 * @return 构建的Result对象
	 */
	public static <T> Result<T> build(T body, ResultCodeEnum resultCodeEnum) {
		Result<T> result = build(body);     // 构建返回结果对象
		result.setCode(resultCodeEnum.getCode()); // 设置返回码
		result.setMessage(resultCodeEnum.getMessage()); // 设置返回消息
		return result;
	}


	/**
	 * 构建成功的返回结果
	 * @param data 返回的数据
	 * @param <T> 返回数据的类型
	 * @return 成功的Result对象
	 */
	public static <T> Result<T> ok(T data) {
		return build(data, ResultCodeEnum.SUCCESS);
	}

	/**
	 * 构建成功的返回结果，无数据
	 * @param <T> 返回数据的类型
	 * @return 成功的Result对象
	 */
	public static <T> Result<T> ok() {
		return Result.ok(null);
	}

	/**
	 * 构建失败的返回结果
	 * @param <T> 返回数据的类型
	 * @return 失败的Result对象
	 */
	public static <T> Result<T> fail() {
		return build(null, ResultCodeEnum.FAIL);
	}

	/**
	 * 构建失败的返回结果，自定义错误码和消息
	 * @param code 自定义错误码
	 * @param message 自定义错误消息
	 * @param <T> 返回数据的类型
	 * @return 失败的Result对象
	 */
	public static <T> Result<T> fail(Integer code, String message) {
		Result<T> result = build(null);
		result.setCode(code);
		result.setMessage(message);
		return result;
	}
}

